package ccm.itesm.mx.servicios;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

//Extiende ListActivity para que podamos modificar una ListView
//Implementa Runnable para el uso de threads para que el ProgressDialog funcione bien
public class TransportecLlegadasActivity extends ListActivity implements Runnable {
	//VARIABLES INICIALES
	//El ProgressDialog es el mensajito usado que dice "Cargando Faltas"
	ProgressDialog cargandoLlegadas;
	
	//Los ArrayList para meter la lista de rutas, de urls y una de JSONs para meter la info cargada desde el JSON
	private ArrayList<String> listaRutas, listaUrls;
	private ArrayList<JSONObject> listaJson;
	
	//Right-click -> Source -> Override/Implement Methods... -> onCreate(bundle)
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	
		//El setContentView le pone el layout a la ListActivity faltas.xml
		setContentView(R.layout.faltas);
		
		//El ProgressDialog (mensajito) que muestra como titulo "Cargando Rutas" y como subtexto "Espera un momento..."
		cargandoLlegadas = ProgressDialog.show(this, "Cargando Rutas", "Espera un momento...", true, false);
		
		//Empezamos nuestro Thread cargarInfo, que se carga la info del JSON mientras el ProgressDialog se muestra
		Thread cargarInfo = new Thread(this);
		cargarInfo.start();
	}
	

	public void run() {
		//Inicializamos las ArrayLists
		listaRutas = new ArrayList<String>();
		listaUrls = new ArrayList<String>();
		listaJson = new ArrayList<JSONObject>();
		
		//Manda a llamar cargaRutas() que mete toda la info en las ArrayLists
		cargaRutas();
		
		//Con un Handler se controla el Thread y se carga la info a nuestro respectivo Layout
		unHandler.sendEmptyMessage(0);
	}
	
	private Handler unHandler = new Handler() {
		//El handleMessage (Right-click -> Source -> Override/Implement Methods... -> handleMessage(Message)
		@Override
		public void handleMessage(Message msg) {
			//Cuando el Thread acaba, usamos nuestro adaptador para poner nuestra info en el Layout
			//Hay que especificar LlegadasActivity.this como el Content, El layout que usa la listactivity y nuestro ArrayList con la info
			setListAdapter(new ArrayAdapter<String>(TransportecLlegadasActivity.this, R.layout.listactivity, listaRutas));
			
			//Ya que cargo toda la info, quitamos nuestro ProgressDialog
			cargandoLlegadas.dismiss();
		}
	};
	
	//Este metodo hace que para cada listitem, cuando le piques, quiera lanzar un intento con el url apropiado
	//Right-click -> Source -> Override/Implement Methods... -> onListItemClick(variables)
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);
		
		//l.setCacheColorHint(1);
		//Toma el URL de nuestra lista de JSON
		String url = "";
		try {
			url = listaJson.get(position).getString("url");
		} catch (JSONException e) {
			Toast.makeText(getBaseContext(), "Hubo una JSONException", Toast.LENGTH_LONG).show();
		}
		
		//Este intento crea una nueva action_view y parsea el URL que tomamos anteriormente
		Intent intento = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
		startActivity(intento);
	}

	//AQUI EMPIEZAN LOS METODOS PARA CARGAR LA INFO DEL JSON
	//Este metodo carga todas la info del JSON hacia nuestras listas
	public void cargaRutas() {
		//En getRutas esta el JSON de la tabla
		String getRutas = "http://campusandroid.appspot.com/getrutasjson?";
		//download(getRutas) recoge toda la informacion del JSON apartir del URL dado
		String respuesta = download(getRutas);
		
		//if(respuesta != null && !respuesta.startsWith("Error")){
			try {
				JSONArray principal = new JSONArray(respuesta);
				
				//EN el JSONArray principal se encuentra toda la info para pasarla a las listas correspondientes
				if(principal.length()>0){
					for(int i =0; i< principal.length();i++){
						JSONObject consultaRuta = principal.getJSONObject(i);
						this.listaJson.add(consultaRuta);
						this.listaRutas.add(consultaRuta.getString("ruta"));
						this.listaUrls.add(consultaRuta.getString("url"));
					}
				} else {
					//Si no hay ninguna materia, tostea que "No hay datos"
					Toast.makeText(getBaseContext(), "No hay datos", Toast.LENGTH_LONG).show();
				}
			} catch (JSONException e) {
				Toast.makeText(getBaseContext(), "JSONException en cargaRutas() en LlegadasActivity.java", Toast.LENGTH_LONG).show();
			}
		//} else {
		//	Toast.makeText(getBaseContext(), respuesta, Toast.LENGTH_LONG).show();
		//}
	}
	
	//Este metodo toma toda la info del URL y la guarda en un string
	public String download(String getRutas) {
		InputStream in = null;
        byte[] data = null;
        URLConnection conn = null;
        try
    	{
	        URL url = new URL(getRutas);
	    	conn = url.openConnection();
	        
	        if ((conn instanceof HttpURLConnection))
	        {
	    		HttpURLConnection httpConn = (HttpURLConnection) conn;
	    		httpConn.setAllowUserInteraction(false);
	    		httpConn.setInstanceFollowRedirects(true);
	    		httpConn.setRequestMethod("GET");
	    		httpConn.connect();
	
	    		if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) 
	    		{
	    			in = httpConn.getInputStream();
	    			ByteArrayOutputStream baos = new ByteArrayOutputStream();
	    			int c;
	    			while((c = in.read()) > -1)
	                    baos.write(c);
	                data = baos.toByteArray();
	                baos.close();
	                in.close();
	                String str = new String(data);
	                return str;
	    		}
	    		else
	            {                
	    			return("Error reading data");
	            }
	        }
    	}
    	catch (Exception ex)
    	{
    		return("Error in connection");
    	}
    	finally
        {
            try
            {
                if (conn != null)
                {
                    conn = null;
                }
                if (in != null)
                {
                    in.close();
                    in = null;
                }

            }catch(IOException ex)
            {
            	return("Error: "+ex.getMessage());
            }
        }   
    	return null;
	}
}